package gops

import (
	"crypto/md5"
	"encoding/hex"
	"errors"
	"fmt"
	"io"
	"os"
)

// Md5File 计算指定文件的MD5哈希值。
func Md5File(filename string) (string, error) {
	// 参数 filename 是要计算MD5哈希的文件的路径。
	// 返回值是文件的MD5哈希值（以十六进制字符串形式）和一个可能出现的错误。
	file, err := os.Open(filename)
	if err != nil {
		return "", errors.New(
			fmt.Sprintf("md5.go hash.FileMd5 os open error %v", err))
	}
	h := md5.New()
	_, err = io.Copy(h, file)
	if err != nil {
		return "", errors.New(fmt.Sprintf("md5.go hash.FileMd5 io copy error %v", err))
	}

	return hex.EncodeToString(h.Sum(nil)), nil
}

// Md5 计算指定字符串的MD5哈希值
func Md5Str(s string) (res string, err error) {
	// 参数 s 指定是哪个字符串
	// 返回指定字符串的MD5哈希值
	md5Object := md5.New()
	_, err = md5Object.Write([]byte(s))
	if err != nil {
		return
	}
	return hex.EncodeToString(md5Object.Sum(nil)), nil
}
